#include "affichage.h"
//#include "LCD_ILI9325.h"
//#include "LCD_utils.h"
//#include "menu.h"
#include "TSC_2046.h"

#include "cursor.h"
#include "LcdHal.h"
#include "TscHal.h"
#include "touchscreen.h"
#include "graphicObject.h"
#include "uiframework.h"

void vTaskCTRL_AFFICHAGE()
{
    portTickType xLastWakeTime;
    xLastWakeTime = xTaskGetTickCount();

    init_AFFICHAGE();

    while(1)
    {
        /* Catching touch events */
        if ( calibration_done )
        {
            ProcessInputData();
        }

        /*Time out calculate for power saving mode*/
        TimeOutCalculate();
        //CursorReadJoystick(POLLING_MODE);
        //TSC_Read();

        GetScreenZone();

        wait(250);
    }
}

void init_AFFICHAGE()
{
    uint32_t time_out = 0xFFF;

    Set_LCD_Resolution( 320, 240 );

    /* Initialize the LCD */
    GL_LCD_Init();

    /* Touch Screen Init */
    //TSC_Init();
    TSC2046_Init();

    /* Set the last Flash Memory address, for screen calibration */
    Set_LastFlashMemoryAddress(0x08040000);

    /* If key is pressed - Start Calibration */
    /*while(GPIO_ReadInputDataBit(USER_BUTTON_PORT, USER_BUTTON_PIN) && (time_out>0))
    {
        time_out--;
    }*/

    if (time_out > 0)
    {
        TS_Calibration();
    }

    GL_Clear(GL_Black);

    /* Check if Calibration has been done*/
    TS_CheckCalibration();

    /*Initialize cursor*/
    //GL_Clear(White);
    CursorInit(GL_NULL);

    /* Menu Initialization*/
    Show_HomeScreen();

    CursorShow( LCD_Height/2, LCD_Width/2 );
}


void LCD_GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);

    /* Backlight and RST : push-pull  50MHz */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;    //backlight
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ;     //LCD-RST
    GPIO_Init(GPIOE, &GPIO_InitStructure);

    /* Other ports: AF_PP,50MHz */
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        //PD
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |
                                GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 |
                                GPIO_Pin_15 | GPIO_Pin_7 | GPIO_Pin_11 ;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
        //PE
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
                                GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |
                                GPIO_Pin_15;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
}

void LCD_FSMC_Configuration(void)
{
    FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
    FSMC_NORSRAMTimingInitTypeDef  p;

    /* Enable the FSMC Clock */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);

    p.FSMC_AddressSetupTime = 0x02;
    p.FSMC_AddressHoldTime = 0x00;
    p.FSMC_DataSetupTime = 0x05;
    p.FSMC_BusTurnAroundDuration = 0x00;
    p.FSMC_CLKDivision = 0x00;
    p.FSMC_DataLatency = 0x00;
    p.FSMC_AccessMode = FSMC_AccessMode_B;

    FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
    FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
    FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;
    FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
    FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
    FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
    FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
    FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
    FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
    FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
    FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
    FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;

    FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);

    /* Enable FSMC Bank1_SRAM Bank */
    FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}
